/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package BUS;

import DAO.DAO;
import GUI.FrameControlDanhMuc.jframeTimSach;
import TOOL.Ulti;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JTable;

/**
 *
 * @author 10520_000
 */
public class Sach  implements IDaTa
{
    // Biết kết nối với CSDL
    
    public Sach()
    {
        
    }
    //Lay thong tin sach theo ma sach
    public ResultSet GetInfo(String name)
    {
        if(name == null) return null;
        try
        {
            List<String> params = new ArrayList<>();
            params.add("char:" +  name) ;//tensach
            return DAO.CallProc("LayThongTinSach", params);
            
        } 
        catch (Exception ex) 
        {
            Logger.getLogger(jframeTimSach.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
    public ResultSet GetInfoMa(String name)
    {
        if(name == null) return null;
        try
        {
            List<String> params = new ArrayList<>();
            params.add("char:" +  name) ;//tensach
            return DAO.CallProc("LayThongTinSachTheoMa", params);
            
        } 
        catch (Exception ex) 
        {
            Logger.getLogger(jframeTimSach.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
    //Ti Kiem Sach
    @Override
    public ResultSet Search(DTO.Idata Obj) 
    {
        try
        {
            List<String> params = new ArrayList<>();
            params.add("char:" +  ((DTO.Sach)Obj).getID()) ;//masach
            params.add("nvarchar:" +  ((DTO.Sach)Obj).TenSach);//tensach
            params.add("nvarchar:" +  ((DTO.Sach)Obj).TheLoai );//theloai
            params.add("nvarchar:" +  ((DTO.Sach)Obj).TacGia );//tacgia
            params.add("smallint:" + ((DTO.Sach)Obj).SoLuongTon);
            params.add("smallint:" + ((DTO.Sach)Obj).SoLuongTon2);
            params.add("char:" + ((DTO.Sach)Obj).type );//Lua chon ti iem theo OR hoac And
            return DAO.CallProc("TimSach", params);
            
        } 
        catch (Exception ex) 
        {
            Logger.getLogger(jframeTimSach.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
    /*
     * Tim theo tac gia trong CSDL
     */
     public ResultSet TimTacGia(String Ten)
    {
        try
        {
            List<String> params = new ArrayList<>();
            params.add("nvarchar:" +  Ten) ;//Ten Tac Gia
            return DAO.CallProc("TimTacGia", params);
            
        } 
        catch (Exception ex) 
        {
            Logger.getLogger(jframeTimSach.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
     
     /*
      * Tim theo the loai sach trong csdl
      */
     public ResultSet TimTheLoai(String Ten)
    {
        try
        {
            List<String> params = new ArrayList<>();
            params.add("nvarchar:" +  Ten) ;//Ten The Loai
            return DAO.CallProc("TimTheLoai", params);
            
        } 
        catch (Exception ex) 
        {
            Logger.getLogger(jframeTimSach.class.getName()).log(Level.SEVERE, null, ex);
            return null;
        }
    }
     
    /*
     * Lấy thôn tin về số lượng tồn của sách
     * MaSach 
     * TenSach 
     * Số lượng tồn
     */
    public ResultSet ThongTinTonSach()
    {
        try
        {
            return DAO.CallProc("ThongTinTonSach");
            
        } 
        catch (Exception ex) 
        {
            return null;
        }
    }

    /*
     * Cập nhật thông tin sách xuống CSDL
     * Mã sách
     * Tên sách
     * Thể loại
     * Tác giả
     * Số lượng tồn
     */
    @Override
    public boolean Update(DTO.Idata Obj) 
    {
        List<String> params = new ArrayList<>();
        params.add("char:" +  ((DTO.Sach)Obj).getID()) ;//masach
        params.add("nvarchar:" +  ((DTO.Sach)Obj).TenSach);//tensach
        params.add("nvarchar:" +  ((DTO.Sach)Obj).TheLoai );//theloai
        params.add("nvarchar:" +  ((DTO.Sach)Obj).TacGia );//tacgia
        params.add("smallint:" + ((DTO.Sach)Obj).SoLuongTon);//soluongton
        return DAO.CallProc("SuaSach", params, true);
    }

    /*
     * Xóa sách từ CSDL
     * Mã Sách
     */
    @Override
    public boolean Delete(DTO.Idata Obj) 
    {
        List<String> params = new ArrayList<>();
        params.add("char:" + ((DTO.Sach)Obj).getID());
        return DAO.CallProc("XoaSach", params, true);
    }

    /*
     * Lấy thông tin toàn bọ sách và truyền vào bảng
     * Bảng phái có chứa các trường:
     * STT
     * Mã sách
     * Tên sách
     * Thể loại
     * Tên tác giả
     * Số lượng tồn
     */
    @Override
    public void LoadData(Object table) 
    {
        ResultSet res = DAO.CallProc("LayThongTinToanBoSach");
        Ulti.FillData((JTable)table, res);
    }
    
    /*
     * Chèn thêm sách mới vào CSDL
     * Mã sách
     * Tên sách
     * Thể loại
     * Tác giả
     * Số lượng tồn
     */
    @Override
    public boolean Insert(DTO.Idata Obj)
    {
        List<String> params = new ArrayList<>();
        params.add("char:" +  ((DTO.Sach)Obj).getID()) ;//masach
        params.add("nvarchar:" +  ((DTO.Sach)Obj).TenSach);//tensach
        params.add("nvarchar:" +  ((DTO.Sach)Obj).TheLoai );//theloai
        params.add("nvarchar:" +  ((DTO.Sach)Obj).TacGia );//tacgia
        params.add("smallint:" + ((DTO.Sach)Obj).SoLuongTon);//soluongtontu
        return DAO.CallProc("ThemSach", params, true);
    }
    
    /*
     * Lấy thông tin tác giả và truyền vào table hoặc bảng tương ứng
     * Phải ép sang kiểu Object khi truyền tham số
     * 
     */
    public void LoadAuthor(Object Obj)
    {
        ResultSet res = DAO.CallProc("TacGia");
        if(Obj.getClass().getName().contains("JTable"))
            Ulti.FillData((JTable )Obj, res);
        else
            Ulti.FillCobobox((JComboBox)Obj, res, 1);
    }
    
    /*
     * Thêm thể loại sách vào cobombox hoặc table
     * nếu là table thì cần có 2 cột là STT và Thể loại
     * Nếu là Cobobox thì truyền trực tiếp
     * Lưu ý: Phải ép sang kiểu object trước khi truyền
     */
    public void LoadCategory(Object Obj)
    {
        ResultSet res = DAO.CallProc("TheLoaiSach");
        if(Obj.getClass().getName().contains("JTable"))
            Ulti.FillData((JTable)Obj, res);
        else
            Ulti.FillCobobox((JComboBox)Obj,res,1);
    }
    
    /*
     * Tạo mã Sách tiếp theo
     */
    @Override
    public String GenerateID()
    {
        try 
        {
            ResultSet res = DAO.CallProc("LayMaSachCuoi");
            if (res.next())
            {    
              try
              {
                  int index  = Integer.parseInt(((String)res.getObject(1)).split("MS")[1].trim());
                  String ms = "MS";
                  ms += (index+1)>=10?(index+1)>=100? (index +1) : "0" + (index +1) : "00" + (index + 1);
                  return ms;
              }
              catch(Exception ie)
              {
                  return "MS001";
              }
            }
            return "MS001";
         } 
        catch (SQLException ex) 
        {
            return "MS001";
        }
    }
    
    /*
     * Lấy tất cả thông tin sách và trả về trong 1 biến ResultSet
     * Có thể gọi àm Ulti.FillData để chèn vào bảng
     * Kết quả trả về:
     * Mã Sách
     * Tên Sách
     * Thể loại
     * Tác giả
     * Số Lượng Tồn
     */
     public ResultSet GetAll()
    {
        try
        {
            return DAO.CallProc("LayThongTinToanBoSach");
        } 
        catch (Exception ex) 
        {
            return null;
        }
    }
    
}
